sectors
[1] "All Industries Total" "Chemicals"
[3] "Computers and electronic products" "Electrical equipment"
[5] "Finance and insurance" "Food"
[7] "Information" "Machinery"
[9] "Mining" "Primary and fabricated metals"
[11] "Professional services" "Retail Trade"
[13] "Total Manufacturing" "Transportation Equipment"
[15] "Utilities" "Wholesale Trade"
glimpse(data)
Rows: 22,470
Columns: 26
$ sector <chr> "All Industries Total", "All Industries Total", "All…
$ country <chr> "Africa", "Africa", "Africa", "Africa", "Africa", "A…
$ year <int> 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007…
$ asset <dbl> 38453, 44211, 52398, 60749, 73964, 93415, 109019, 13…
$ compensation_employees <dbl> 2211, 2332, 2242, 2415, 2745, 3362, 3650, 3994, 4292…
$ employment <dbl> 126000, 137200, 139800, 142700, 149800, 154800, 1547…
$ expenditures <dbl> 3522, 2765, 4147, 5352, 6793, 8046, 10389, 11172, 11…
$ net_income <dbl> 2039, 3981, 2537, 2821, 4740, 7732, 13987, 18154, 21…
$ net_property_plant_and_equipment <dbl> 16140, 16946, 21180, 23297, 29025, 34448, 41078, 478…
$ total_sales <dbl> 25539, 34377, 33261, 34070, 40465, 51787, 66438, 791…
$ value_added <dbl> 8917, 13785, 12652, 13475, 16861, 22897, 33406, 4233…
$ CI <dbl> 16622, 20592, 20609, 20595, 23604, 28890, 33032, 367…
$ Kcca_1 <dbl> 22313, 27265, 31218, 37452, 44939, 58967, 67941, 836…
$ r <dbl> 0.09138171, 0.14601137, 0.08126722, 0.07532308, 0.10…
$ Kcca_2 <dbl> 181896.4, 141030.1, 253595.5, 273422.2, 223784.8, 22…
$ Kva <dbl> 24195.21, 15971.36, 27588.00, 32061.89, 26024.80, 25…
$ TG <dbl> 0.032546817, 0.066148952, 0.031718051, 0.030395141, …
$ TGstock <dbl> 0.12633209, 0.23492270, 0.11978281, 0.12108855, 0.16…
$ TGasset <dbl> 0.05302577, 0.09004546, 0.04841788, 0.04643698, 0.06…
$ PT <dbl> 0.07076984, 0.10047376, 0.09050072, 0.09442887, 0.11…
$ Rem <dbl> 0.001462302, 0.001416424, 0.001336433, 0.001410301, …
$ COtec <dbl> 0.12809524, 0.12351312, 0.15150215, 0.16325858, 0.19…
$ COv <dbl> 7.299864, 7.266724, 9.446922, 9.646791, 10.573770, 1…
$ TP <dbl> 0.9222071, 1.7071184, 1.1315789, 1.1681159, 1.726776…
$ TPr <dbl> 0.084272862, 0.249258689, 0.091960273, 0.087986091, …
$ Continent <chr> "", "", "", "", "", "", "", "", "", "", "", "", "", …
Stock de capital invertido
TG
data %>%
filter( country %in% c("South America", "European Union", "All Countries Total", "Asia and Pacific") ) %>%
filter( !sector %in% c("Finance without depository", "Finance and insurance") ) %>%
ggplot(aes(year, TGstock, color = country)) +
geom_line(size = 0.75, alpha = 0.75)+
facet_wrap(~sector)+ #scales = "free"
scale_y_continuous(labels = scales::percent)+
theme_minimal()+
labs(title= "Tasa de ganancia (sin rotación) de inversiones de EEUU", subtitle = "Europa y América del Sur")+
theme(legend.position = "bottom",
legend.title = element_blank(),
axis.text.x = element_text(angle = 45, size= axis_size),
axis.text.y = element_text(size= axis_size),
axis.title = element_blank() ,
strip.text = element_text(size=strip_size))+
scale_color_manual(values=wes_palette(n=4, name="Moonrise2")) #"Royal2"
ggsave("./results/bea/majority_owned_nonbank/tg_eu_sa_all_2.png")
Saving 7.29 x 4.5 in image

data %>%
filter( Continent %in% c("South America") ) %>%
filter( !sector %in% c("Finance without depository",
"Finance and insurance",
"Professional services",
"Wholesale Trade") ) %>%
ggplot(aes(year, TGstock, color = country)) +
geom_line()+
facet_wrap(~sector)+ #scales = "free"
scale_y_continuous(labels = scales::percent)+
theme_minimal()+
labs(title= "Tasa de ganancia (sin rotación) de inversiones de EEUU", subtitle = "América del Sur")+
theme(legend.position = "bottom",
legend.title = element_blank(),
legend.text = element_text(size = axis_size+6),
axis.text.x = element_text(angle = 45, size= axis_size+6),
axis.text.y = element_text(size= axis_size+6),
axis.title = element_blank() ,
strip.text = element_text(size=strip_size+5))+
scale_color_brewer(palette="Paired")
Warning: Removed 53 rows containing missing values (`geom_line()`).
ggsave("./results/bea/majority_owned_nonbank/tg_sa_2.png", width = 15, height=10)
Warning: Removed 53 rows containing missing values (`geom_line()`).

data %>%
filter( Continent %in% c("South America") | country %in% c("All Countries Total",
"European Union") ) %>%
ggplot(aes(year, TGstock, color = country)) +
geom_line()+
facet_wrap(~sector, scales = "free")+
scale_y_continuous(labels = scales::percent)+
theme_minimal()+
labs(title= "Tasa de ganancia (sin rotación) de inversiones de EEUU", subtitle = "América del Sur, Europa y total paises")+
theme(legend.position = "bottom",
legend.title = element_blank(),
axis.text.x = element_text(angle = 45, size= 5),
axis.text.y = element_text(size= 5),
axis.title = element_blank() ,
strip.text = element_text(size=10))+
scale_color_brewer(palette="Paired")
ggsave("./results/bea/majority_owned_nonbank/tg_sa_eu_all.png", width = 15, height=10)

data %>%
filter( country %in% c("South America", "European Union", "All Countries Total") ) %>%
group_by(country, sector) %>%
summarise(TGstock = mean(TGstock, na.rm=T) ,
PT = mean(PT, na.rm=T)) %>%
ggplot(aes(country, TGstock, fill = country)) +
geom_col(position = "dodge")+
facet_wrap(~sector, scales = "free")+
scale_y_continuous(labels = scales::percent_format(accuracy = 1L))+
theme_minimal()+
labs(title= "Tasa de ganancia (sin rotación) de inversiones de EEUU", subtitle = "América del Sur, Europa y total paÃses (promedio 1999-2019)")+
theme(legend.position = "bottom",
legend.title = element_blank(),
axis.text.x = element_blank(),
axis.text.y = element_text(size= 8),
axis.title = element_blank() ,
strip.text = element_text(size=5))+
scale_fill_manual(values=wes_palette(n=3, name="Royal2"))
`summarise()` has grouped output by 'country'. You can override using the `.groups` argument.
ggsave("./results/bea/majority_owned_nonbank/tg_eu_sa_all_avg.png")
Saving 7.29 x 4.5 in image

Productivity (PT)
data_prod <- data %>%
select(c(sector, country, Continent , year,value_added, employment, PT)) %>%
filter(PT > 0 & employment > 0 ) %>%
arrange(desc(PT)) # arrange(PT)
glimpse(data_prod)
Rows: 16,857
Columns: 7
$ sector <chr> "Mining", "Wholesale Trade", "Wholesale Trade", "Wholesale Trade", "Mining", "Wholesale Trade", "Mining"…
$ country <chr> "Denmark", "Barbados", "Barbados", "Barbados", "Denmark", "United Kingdom Islands, Caribbean", "Denmark"…
$ Continent <chr> "Europe", "Central America and the Caribbean", "Central America and the Caribbean", "Central America and…
$ year <int> 2008, 2008, 2006, 2011, 2011, 2007, 2012, 2004, 2010, 2005, 2006, 2010, 2008, 2010, 2003, 2005, 2013, 20…
$ value_added <dbl> 7326, 3032, 2295, 2142, 5671, 1776, 4741, 1556, 4658, 1430, 1372, 2579, 2486, 1237, 1203, 1172, 4615, 22…
$ employment <dbl> 200, 100, 100, 100, 300, 100, 300, 100, 300, 100, 100, 200, 200, 100, 100, 100, 400, 200, 100, 300, 200,…
$ PT <dbl> 36.630000, 30.320000, 22.950000, 21.420000, 18.903333, 17.760000, 15.803333, 15.560000, 15.526667, 14.30…
head(data_prod)
top_countries_by_year <- data_prod %>%
select(-c(Continent , value_added, employment)) %>%
group_by(year) %>%
top_n(3, PT) %>%
arrange(-PT)
top_countries_by_year
top_countries_by_year <- data_prod %>%
select(-c(Continent , value_added, employment)) %>%
group_by(year) %>%
top_n(3, PT) %>%
arrange(-PT)
top_countries_by_year
data_prod %>%
filter( country %in% c("South America", "Europe") ) %>%
ggplot(aes(year, PT/10e3, fill = country)) +
geom_col(position = "dodge")+
facet_wrap(~sector, scales = "free")+
theme_minimal()+
labs(title= "Productividad de inversiones de EEUU", subtitle = "Total Europa y América del Sur",
y = "Miles de USD por obrero")+
theme(legend.position = "bottom",
legend.title = element_blank(),
axis.text.x = element_text(angle = 45, size= 5),
axis.text.y = element_text(size= 5),
axis.title.x = element_blank() ,
axis.title.y = element_text(size = 3.9) ,
strip.text = element_text(size=3.9))+
scale_fill_manual(values=wes_palette(n=3, name="Royal1"))
ggsave(paste0(results_path,"pt_eu_sa.png"))
Saving 7.29 x 4.5 in image
# Iterate through each sector
for (sec in sectors) {
# Subset the data for the current sector
sector_data <- data_prod %>%
filter(sector == sec)
# Create the plot for the current sector
plot <- ggplot(sector_data, aes(year, PT/10e3, color = country)) +
geom_line() +
facet_wrap(~Continent) + #scales = "free"
theme_minimal() +
labs(title = paste("Productividad en", sec, sep = " "),
subtitle = paste("Total paises por contiente", sec),
y = "Miles de USD por obrero") +
theme(legend.position = "none",
legend.title = element_blank(),
axis.text.x = element_text(angle = 45, size = 5),
axis.text.y = element_text(size = 5),
axis.title.x = element_blank(),
axis.title.y = element_text(size = 3.9),
strip.text = element_text(size = 3.9))
print(ggplotly(plot))
ggsave(filename = paste(results_path, "plot_pt_", sec, ".png", sep = ""),
plot = plot)
}
Saving 7.29 x 4.5 in image
Saving 7.29 x 4.5 in image
Saving 7.29 x 4.5 in image
Saving 7.29 x 4.5 in image
Saving 7.29 x 4.5 in image
Saving 7.29 x 4.5 in image
Saving 7.29 x 4.5 in image
Saving 7.29 x 4.5 in image
Saving 7.29 x 4.5 in image
Saving 7.29 x 4.5 in image
Saving 7.29 x 4.5 in image
Saving 7.29 x 4.5 in image
`geom_line()`: Each group consists of only one observation.
ℹ Do you need to adjust the group aesthetic?
Saving 7.29 x 4.5 in image
Saving 7.29 x 4.5 in image
Saving 7.29 x 4.5 in image
Saving 7.29 x 4.5 in image

data_prod %>%
filter( Continent %in% c("South America") ) %>%
left_join(data %>%
filter(country == "Europe") %>%
select(year, sector, PTeu=PT) ,
by = c("year", "sector" )) %>%
mutate(PTrel = PT/PTeu ) %>%
ggplot(aes(year, PTrel, color = country)) +
geom_line(size = 0.3)+
facet_wrap(~sector, scales = "free")+
scale_y_continuous(labels = scales::percent)+
theme_minimal()+
labs(title= "Brecha de productividad de inversiones de EEUU",
subtitle = "América del Sur relativa a total Europa")+
theme(legend.position = "bottom",
legend.title = element_blank(),
axis.text.x = element_text(angle = 45, size= 5),
axis.text.y = element_text(size= 4),
axis.title = element_blank() ,
strip.text = element_text(size=5))+
scale_color_brewer(palette="Paired")
ggsave("./results/bea/majority_owned_nonbank/pt_eu_sa_relativa.png")
Saving 7.29 x 4.5 in image

## Nivel de productividad (todos los sectores)
data %>%
filter( country %in% c("South America", "European Union", "All Countries Total") ) %>%
group_by(country, sector) %>%
summarise(TGstock = mean(TGstock, na.rm=T) ,
PT = mean(PT/10e3, na.rm=T)) %>%
ggplot(aes(country, PT, fill = country)) +
geom_col(position = "dodge")+
facet_wrap(~sector, scales = "free")+
theme_minimal()+
labs(title= "Productividad de inversiones de EEUU",
subtitle = "América del Sur, Europa y total paÃses (promedio 1999-2019)",
y = "Miles de USD por obrero")+
theme(legend.position = "bottom",
legend.title = element_blank(),
axis.text.x = element_blank(),
axis.text.y = element_text(size= 8),
axis.title.x = element_blank() ,
axis.title.y = element_text(size = 5) ,
strip.text = element_text(size=5))+
scale_fill_manual(values=wes_palette(n=3, name="Moonrise3"))
`summarise()` has grouped output by 'country'. You can override using the `.groups` argument.
ggsave("./results/bea/majority_owned_nonbank/pt_eu_sa_all_avg.png")
Saving 7.29 x 4.5 in image

## Nivel de productividad (sectores seleccionados)
data %>%
filter( country %in% c("South America", "European Union", "All Countries Total") &
sector %in% c("All Industries Total","Mining", "Transportation Equipment", "Total Manufacturing" )) %>%
group_by(country, sector) %>%
summarise(TGstock = mean(TGstock, na.rm=T) ,
PT = mean(PT/10e3, na.rm=T)) %>%
ggplot(aes(country, PT, fill = country)) +
geom_col(position = "dodge")+
facet_wrap(~sector, scales = "free")+
theme_minimal()+
labs(title= "Productividad del trabajo de inversiones de EEUU",
subtitle = "América del Sur, Europa y total paÃses (promedio 1999-2019)",
y = "Miles de USD por obrero")+
theme(plot.title = element_text(size= title_size),
plot.subtitle = element_text(size= title_size*.8),
legend.position = "bottom",
legend.title = element_blank(),
legend.text = element_text(size=text_size),
axis.text.x = element_blank(),
axis.text.y = element_text(size= text_size),
axis.title.x = element_blank() ,
axis.title.y = element_text(size = text_size) ,
strip.text = element_text(size=text_size))+
scale_fill_manual(values=wes_palette(n=3, name="Moonrise3"))
`summarise()` has grouped output by 'country'. You can override using the `.groups` argument.
ggsave("./results/bea/majority_owned_nonbank/pt_eu_sa_all_avg_sectors.png", width = 15, height=10)

TG y PT
data %>%
filter( country %in% c("South America", "European Union", "All Countries Total",
"Asia and Pacific", "Central America", "Mexico") ) %>%
filter( sector %in% c("All Industries Total","Mining",
"Transportation Equipment", "Total Manufacturing" ) ) %>%
group_by(country, sector) %>%
summarise(TGstock = mean(TGstock, na.rm=T) ,
PT = mean(PT/10e3, na.rm=T)) %>%
reshape2::melt() %>%
ggplot(aes(x=reorder(variable,-value),y= value, fill = country)) +
# geom_col(position = "dodge")+
geom_bar(position = "dodge", stat="identity")+
facet_wrap(sector~variable,
# scales = "free",
ncol=2
# ,strip.position = c("left", "top")
# labeller = as_labeller(c(TGstock = "ratio TG", PT = "Miles de USD por obrero") )
)+
theme_minimal()+
labs(title= "Productividad del trabajo y TG de inversiones de EEUU",
subtitle = "Promedio 1999-2019", y="Miles de USD por obrero y ratio TG")+
theme(plot.title = element_text(size= 12),
plot.subtitle = element_text(size= 12*.8),
legend.text = element_text(size=7),
legend.position = "bottom",
legend.title = element_blank(),
axis.title.x = element_blank(),
axis.title.y = element_text(size= 10),
axis.text.y = element_text(size= 7),
axis.text.x = element_blank(),
strip.text = element_text(size=10),
strip.placement = "outside" )+
scale_fill_brewer(palette="Paired")
`summarise()` has grouped output by 'country'. You can override using the `.groups` argument.
Using country, sector as id variables

Salario
data %>%
filter( country %in% c("South America", "European Union", "All Countries Total",
"Asia and Pacific", "Central America", "Mexico") ) %>%
filter( sector %in% c("All Industries Total","Mining",
"Transportation Equipment", "Total Manufacturing" ) ) %>%
group_by(country, sector) %>%
summarise(Rem = mean(Rem*10e6, na.rm=T) ) %>%
reshape2::melt() %>%
ggplot(aes(x=reorder(variable,-value),y= value, fill = country)) +
# geom_col(position = "dodge")+
geom_bar(position = "dodge", stat="identity")+
facet_wrap(~sector, scales = "free", ncol=2)+
theme_minimal()+
labs(title= "Salario promedio en las inversiones de EEUU",
subtitle = "Promedio 1999-2019", y="USD")+
theme(plot.title = element_text(size=title_size),
plot.subtitle = element_text(size=title_size*.8),
legend.position = "bottom",
legend.title = element_blank(),
legend.text = element_text(size=text_size),
axis.title.x = element_blank(),
axis.title.y = element_text(size= text_size),
axis.text.y = element_text(size= text_size),
axis.text.x = element_blank(),
strip.text = element_text(size=text_size))+
scale_fill_brewer(palette="Paired")
`summarise()` has grouped output by 'country'. You can override using the `.groups` argument.
Using country, sector as id variables
ggsave("./results/bea/majority_owned_nonbank/salario_avg_sectors.png", width = 15, height = 10)

LS0tDQp0aXRsZTogIk1ham9yaXR5IG93bmVkIEVEQSINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNCg0KDQpgYGB7cn0NCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShwbG90bHkpDQpsaWJyYXJ5KHdlc2FuZGVyc29uKQ0KbGlicmFyeShSQ29sb3JCcmV3ZXIgKQ0KDQojIHNldHdkKCJDOi9BcmNoaXZvcy9kYXRvcy9iZWEvY29kaWdvcy9tYWpvcml0eV9vd25lZC8iKQ0KIyBzZXR3ZCgiQzovRG9jdW1lbnRzL2RhdGEvYmVhL2NvZGlnb3MvbWFqb3JpdHlfb3duZWQvIikNCg0KcmVzdWx0c19wYXRoID0gJy4vcmVzdWx0cy9iZWEvbWFqb3JpdHlfb3duZWRfbm9uYmFuay8nDQoNCiNwYXJhbXMNCnRpdGxlX3NpemU9NDANCnRleHRfc2l6ZT0gMzANCmF4aXNfc2l6ZT0gNQ0Kc3RyaXBfc2l6ZT0gNg0KDQpkYXRhIDwtIHJlYWQuY3N2KCAiLi4vcmVzdWx0cy9iZWEvbWFqb3JpdHlfb3duZWRfbm9uYmFuay9kYXRhX21ham9yaXR5X293bmVkX25vbmJhbmsuY3N2IikgJT4lIA0KICBmaWx0ZXIoc2VjdG9yICE9ICJPdGhlciBJbmR1c3RyaWVzIikgJT4lIA0KICBtdXRhdGUoc2VjdG9yID0gY2FzZV93aGVuKHNlY3RvciA9PSAiRWxlY3RyaWNhbCBlcXVpcG1lbnQsIGFwcGxpYW5jZXMsIGFuZCBjb21wb25lbnRzIiB+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRWxlY3RyaWNhbCBlcXVpcG1lbnQiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3RvciA9PSAiRmluYW5jZSAoZXhjZXB0IGRlcG9zaXRvcnkgaW5zdGl0dXRpb25zKSBhbmQgaW5zdXJhbmNlIiB+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmluYW5jZSBhbmQgaW5zdXJhbmNlIiwgIyAiRmluYW5jZSB3aXRob3V0IGRlcG9zaXRvcnkiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3RvciA9PSAiUHJvZmVzc2lvbmFsLCBzY2llbnRpZmljLCBhbmQgdGVjaG5pY2FsIHNlcnZpY2VzIiB+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQcm9mZXNzaW9uYWwgc2VydmljZXMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVCB+IHNlY3RvciApKQ0KDQojIENyZWF0ZSBhIHZlY3RvciBvZiB1bmlxdWUgc2VjdG9ycw0Kc2VjdG9ycyA8LSB1bmlxdWUoZGF0YSRzZWN0b3IpDQpzZWN0b3JzDQpgYGANCg0KYGBge3J9DQpnbGltcHNlKGRhdGEpDQpgYGANCg0KDQojIFN0b2NrIGRlIGNhcGl0YWwgaW52ZXJ0aWRvDQpgYGB7cn0NCg0KYGBgDQoNCg0KIyBURw0KYGBge3J9DQoNCmRhdGEgJT4lDQogIGZpbHRlciggY291bnRyeSAlaW4lIGMoIlNvdXRoIEFtZXJpY2EiLCAiRXVyb3BlYW4gVW5pb24iLCAiQWxsIENvdW50cmllcyBUb3RhbCIsICJBc2lhIGFuZCBQYWNpZmljIikgKSAlPiUNCiAgZmlsdGVyKCAhc2VjdG9yICVpbiUgYygiRmluYW5jZSB3aXRob3V0IGRlcG9zaXRvcnkiLCAiRmluYW5jZSBhbmQgaW5zdXJhbmNlIikgKSAlPiUNCiAgZ2dwbG90KGFlcyh5ZWFyLCBUR3N0b2NrLCBjb2xvciA9IGNvdW50cnkpKSArDQogIGdlb21fbGluZShzaXplID0gMC43NSwgYWxwaGEgPSAwLjc1KSsNCiAgZmFjZXRfd3JhcCh+c2VjdG9yKSsgI3NjYWxlcyA9ICJmcmVlIg0KICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50KSsNCiAgdGhlbWVfbWluaW1hbCgpKw0KICBsYWJzKHRpdGxlPSAiVGFzYSBkZSBnYW5hbmNpYSAoc2luIHJvdGFjacOzbikgZGUgaW52ZXJzaW9uZXMgZGUgRUVVVSIsIHN1YnRpdGxlID0gIkV1cm9wYSB5IEFtw6lyaWNhIGRlbCBTdXIiKSsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsDQogICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgc2l6ZT0gYXhpc19zaXplKSwNCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZT0gYXhpc19zaXplKSwNCiAgICAgICAgYXhpcy50aXRsZSAgPSBlbGVtZW50X2JsYW5rKCkgLA0KICAgICAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemU9c3RyaXBfc2l6ZSkpKw0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPXdlc19wYWxldHRlKG49NCwgbmFtZT0iTW9vbnJpc2UyIikpICMiUm95YWwyIg0KZ2dzYXZlKCIuL3Jlc3VsdHMvYmVhL21ham9yaXR5X293bmVkX25vbmJhbmsvdGdfZXVfc2FfYWxsXzIucG5nIikNCg0KDQoNCmRhdGEgJT4lDQogIGZpbHRlciggQ29udGluZW50ICVpbiUgYygiU291dGggQW1lcmljYSIpICkgJT4lDQogIGZpbHRlciggIXNlY3RvciAlaW4lIGMoIkZpbmFuY2Ugd2l0aG91dCBkZXBvc2l0b3J5IiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgIkZpbmFuY2UgYW5kIGluc3VyYW5jZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgIlByb2Zlc3Npb25hbCBzZXJ2aWNlcyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgIldob2xlc2FsZSBUcmFkZSIpICkgJT4lDQogIGdncGxvdChhZXMoeWVhciwgVEdzdG9jaywgY29sb3IgPSBjb3VudHJ5KSkgKw0KICBnZW9tX2xpbmUoKSsNCiAgZmFjZXRfd3JhcCh+c2VjdG9yKSsgI3NjYWxlcyA9ICJmcmVlIg0KICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50KSsNCiAgdGhlbWVfbWluaW1hbCgpKw0KICBsYWJzKHRpdGxlPSAiVGFzYSBkZSBnYW5hbmNpYSAoc2luIHJvdGFjacOzbikgZGUgaW52ZXJzaW9uZXMgZGUgRUVVVSIsIHN1YnRpdGxlID0gIkFtw6lyaWNhIGRlbCBTdXIiKSsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsDQogICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IGF4aXNfc2l6ZSs2KSwNCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgc2l6ZT0gYXhpc19zaXplKzYpLA0KICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplPSBheGlzX3NpemUrNiksDQogICAgICAgIGF4aXMudGl0bGUgID0gZWxlbWVudF9ibGFuaygpICwNCiAgICAgICAgc3RyaXAudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplPXN0cmlwX3NpemUrNSkpKw0KICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZT0iUGFpcmVkIikNCmdnc2F2ZSgiLi9yZXN1bHRzL2JlYS9tYWpvcml0eV9vd25lZF9ub25iYW5rL3RnX3NhXzIucG5nIiwgd2lkdGggPSAxNSwgaGVpZ2h0PTEwKQ0KDQpkYXRhICU+JQ0KICBmaWx0ZXIoIENvbnRpbmVudCAlaW4lIGMoIlNvdXRoIEFtZXJpY2EiKSB8IGNvdW50cnkgJWluJSBjKCJBbGwgQ291bnRyaWVzIFRvdGFsIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXVyb3BlYW4gVW5pb24iKSApICU+JQ0KICBnZ3Bsb3QoYWVzKHllYXIsIFRHc3RvY2ssIGNvbG9yID0gY291bnRyeSkpICsNCiAgZ2VvbV9saW5lKCkrDQogIGZhY2V0X3dyYXAofnNlY3Rvciwgc2NhbGVzID0gImZyZWUiKSsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6cGVyY2VudCkrDQogIHRoZW1lX21pbmltYWwoKSsNCiAgbGFicyh0aXRsZT0gIlRhc2EgZGUgZ2FuYW5jaWEgKHNpbiByb3RhY2nDs24pIGRlIGludmVyc2lvbmVzIGRlIEVFVVUiLCBzdWJ0aXRsZSA9ICJBbcOpcmljYSBkZWwgU3VyLCBFdXJvcGEgeSB0b3RhbCBwYWlzZXMiKSsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsDQogICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgc2l6ZT0gNSksDQogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemU9IDUpLA0KICAgICAgICBheGlzLnRpdGxlICA9IGVsZW1lbnRfYmxhbmsoKSAsDQogICAgICAgIHN0cmlwLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZT0xMCkpKw0KICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZT0iUGFpcmVkIikNCmdnc2F2ZSgiLi9yZXN1bHRzL2JlYS9tYWpvcml0eV9vd25lZF9ub25iYW5rL3RnX3NhX2V1X2FsbC5wbmciLCB3aWR0aCA9IDE1LCBoZWlnaHQ9MTApDQoNCg0KZGF0YSAlPiUNCiAgZmlsdGVyKCBjb3VudHJ5ICVpbiUgYygiU291dGggQW1lcmljYSIsICJFdXJvcGVhbiBVbmlvbiIsICJBbGwgQ291bnRyaWVzIFRvdGFsIikgKSAlPiUNCiAgZ3JvdXBfYnkoY291bnRyeSwgc2VjdG9yKSAlPiUgDQogIHN1bW1hcmlzZShUR3N0b2NrID0gbWVhbihUR3N0b2NrLCBuYS5ybT1UKSAsIA0KICAgICAgICAgICAgUFQgPSBtZWFuKFBULCBuYS5ybT1UKSkgJT4lIA0KICBnZ3Bsb3QoYWVzKGNvdW50cnksIFRHc3RvY2ssIGZpbGwgPSBjb3VudHJ5KSkgKw0KICBnZW9tX2NvbChwb3NpdGlvbiA9ICJkb2RnZSIpKw0KICBmYWNldF93cmFwKH5zZWN0b3IsIHNjYWxlcyA9ICJmcmVlIikrDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnRfZm9ybWF0KGFjY3VyYWN5ID0gMUwpKSsNCiAgdGhlbWVfbWluaW1hbCgpKw0KICBsYWJzKHRpdGxlPSAiVGFzYSBkZSBnYW5hbmNpYSAoc2luIHJvdGFjacOzbikgZGUgaW52ZXJzaW9uZXMgZGUgRUVVVSIsIHN1YnRpdGxlID0gIkFtw6lyaWNhIGRlbCBTdXIsIEV1cm9wYSB5IHRvdGFsIHBhw61zZXMgKHByb21lZGlvIDE5OTktMjAxOSkiKSsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsDQogICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemU9IDgpLA0KICAgICAgICBheGlzLnRpdGxlICA9IGVsZW1lbnRfYmxhbmsoKSAsDQogICAgICAgIHN0cmlwLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZT01KSkrDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz13ZXNfcGFsZXR0ZShuPTMsIG5hbWU9IlJveWFsMiIpKQ0KZ2dzYXZlKCIuL3Jlc3VsdHMvYmVhL21ham9yaXR5X293bmVkX25vbmJhbmsvdGdfZXVfc2FfYWxsX2F2Zy5wbmciKQ0KDQpgYGANCg0KIyBQcm9kdWN0aXZpdHkgKFBUKQ0KYGBge3J9DQpkYXRhX3Byb2QgPC0gZGF0YSAlPiUNCiAgICBzZWxlY3QoYyhzZWN0b3IsIGNvdW50cnksIENvbnRpbmVudCAsIHllYXIsdmFsdWVfYWRkZWQsIGVtcGxveW1lbnQsIFBUKSkgJT4lDQogICAgZmlsdGVyKFBUID4gMCAmICBlbXBsb3ltZW50ID4gMCApICU+JQ0KICAgIGFycmFuZ2UoZGVzYyhQVCkpICMgICAgYXJyYW5nZShQVCkNCg0KZ2xpbXBzZShkYXRhX3Byb2QpDQpoZWFkKGRhdGFfcHJvZCkNCmBgYA0KDQpgYGB7cn0NCnRvcF9jb3VudHJpZXNfYnlfeWVhciA8LSBkYXRhX3Byb2QgJT4lDQogIHNlbGVjdCgtYyhDb250aW5lbnQgLCB2YWx1ZV9hZGRlZCwgZW1wbG95bWVudCkpICU+JSANCiAgZ3JvdXBfYnkoeWVhcikgJT4lDQogIHRvcF9uKDMsIFBUKSAlPiUgDQogIGFycmFuZ2UoLVBUKQ0KdG9wX2NvdW50cmllc19ieV95ZWFyDQpgYGANCg0KDQpgYGB7cn0NCnRvcF9jb3VudHJpZXNfYnlfeWVhciA8LSBkYXRhX3Byb2QgJT4lDQogIHNlbGVjdCgtYyhDb250aW5lbnQgLCB2YWx1ZV9hZGRlZCwgZW1wbG95bWVudCkpICU+JSANCiAgZ3JvdXBfYnkoeWVhcikgJT4lDQogIHRvcF9uKDMsIFBUKSAlPiUgDQogIGFycmFuZ2UoLVBUKQ0KdG9wX2NvdW50cmllc19ieV95ZWFyDQpgYGANCg0KDQpgYGB7cn0NCmRhdGFfcHJvZCAlPiUNCiAgZmlsdGVyKCBjb3VudHJ5ICVpbiUgYygiU291dGggQW1lcmljYSIsICJFdXJvcGUiKSApICU+JQ0KICBnZ3Bsb3QoYWVzKHllYXIsIFBULzEwZTMsIGZpbGwgPSBjb3VudHJ5KSkgKw0KICBnZW9tX2NvbChwb3NpdGlvbiA9ICJkb2RnZSIpKw0KICBmYWNldF93cmFwKH5zZWN0b3IsIHNjYWxlcyA9ICJmcmVlIikrDQogIHRoZW1lX21pbmltYWwoKSsNCiAgbGFicyh0aXRsZT0gIlByb2R1Y3RpdmlkYWQgZGUgaW52ZXJzaW9uZXMgZGUgRUVVVSIsIHN1YnRpdGxlID0gIlRvdGFsIEV1cm9wYSB5IEFtw6lyaWNhIGRlbCBTdXIiLA0KICAgICAgIHkgPSAiTWlsZXMgZGUgVVNEIHBvciBvYnJlcm8iKSsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsDQogICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgc2l6ZT0gNSksDQogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemU9IDUpLA0KICAgICAgICBheGlzLnRpdGxlLnggID0gZWxlbWVudF9ibGFuaygpICwNCiAgICAgICAgYXhpcy50aXRsZS55ICA9IGVsZW1lbnRfdGV4dChzaXplID0gMy45KSAsDQogICAgICAgIHN0cmlwLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZT0zLjkpKSsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPXdlc19wYWxldHRlKG49MywgbmFtZT0iUm95YWwxIikpDQpnZ3NhdmUocGFzdGUwKHJlc3VsdHNfcGF0aCwicHRfZXVfc2EucG5nIikpDQoNCg0KIyBJdGVyYXRlIHRocm91Z2ggZWFjaCBzZWN0b3INCmZvciAoc2VjIGluIHNlY3RvcnMpIHsNCiAgIyBTdWJzZXQgdGhlIGRhdGEgZm9yIHRoZSBjdXJyZW50IHNlY3Rvcg0KICBzZWN0b3JfZGF0YSA8LSBkYXRhX3Byb2QgJT4lDQogICAgZmlsdGVyKHNlY3RvciA9PSBzZWMpIA0KICANCiAgIyBDcmVhdGUgdGhlIHBsb3QgZm9yIHRoZSBjdXJyZW50IHNlY3Rvcg0KICBwbG90IDwtIGdncGxvdChzZWN0b3JfZGF0YSwgYWVzKHllYXIsIFBULzEwZTMsIGNvbG9yID0gY291bnRyeSkpICsNCiAgICBnZW9tX2xpbmUoKSArDQogICAgZmFjZXRfd3JhcCh+Q29udGluZW50KSArICNzY2FsZXMgPSAiZnJlZSINCiAgICB0aGVtZV9taW5pbWFsKCkgKw0KICAgIGxhYnModGl0bGUgPSBwYXN0ZSgiUHJvZHVjdGl2aWRhZCBlbiIsIHNlYywgc2VwID0gIiAiKSwNCiAgICAgICAgIHN1YnRpdGxlID0gcGFzdGUoIlRvdGFsIHBhaXNlcyBwb3IgY29udGllbnRlIiwgc2VjKSwNCiAgICAgICAgIHkgPSAiTWlsZXMgZGUgVVNEIHBvciBvYnJlcm8iKSArDQogICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLA0KICAgICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBzaXplID0gNSksDQogICAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDUpLA0KICAgICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDMuOSksDQogICAgICAgICAgc3RyaXAudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMy45KSkgDQogIHByaW50KGdncGxvdGx5KHBsb3QpKQ0KICBnZ3NhdmUoZmlsZW5hbWUgPSBwYXN0ZShyZXN1bHRzX3BhdGgsICJwbG90X3B0XyIsIHNlYywgIi5wbmciLCBzZXAgPSAiIiksDQogICAgICAgICBwbG90ID0gcGxvdCkNCiAgICANCiAgDQp9DQoNCg0KZGF0YV9wcm9kICU+JQ0KICBmaWx0ZXIoIENvbnRpbmVudCAlaW4lIGMoIlNvdXRoIEFtZXJpY2EiKSApICU+JQ0KICBsZWZ0X2pvaW4oZGF0YSAlPiUgDQogICAgICAgICAgICAgIGZpbHRlcihjb3VudHJ5ID09ICJFdXJvcGUiKSAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdCh5ZWFyLCBzZWN0b3IsIFBUZXU9UFQpICwNCiAgICAgICAgICAgIGJ5ID0gYygieWVhciIsICJzZWN0b3IiICkpICU+JQ0KICBtdXRhdGUoUFRyZWwgPSBQVC9QVGV1ICkgJT4lIA0KICBnZ3Bsb3QoYWVzKHllYXIsIFBUcmVsLCBjb2xvciA9IGNvdW50cnkpKSArDQogIGdlb21fbGluZShzaXplID0gMC4zKSsNCiAgZmFjZXRfd3JhcCh+c2VjdG9yLCBzY2FsZXMgPSAiZnJlZSIpKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50KSsNCiAgdGhlbWVfbWluaW1hbCgpKw0KICBsYWJzKHRpdGxlPSAiQnJlY2hhIGRlIHByb2R1Y3RpdmlkYWQgZGUgaW52ZXJzaW9uZXMgZGUgRUVVVSIsIA0KICAgICAgIHN1YnRpdGxlID0gIkFtw6lyaWNhIGRlbCBTdXIgcmVsYXRpdmEgYSB0b3RhbCBFdXJvcGEiKSsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsDQogICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgc2l6ZT0gNSksDQogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemU9IDQpLA0KICAgICAgICBheGlzLnRpdGxlICA9IGVsZW1lbnRfYmxhbmsoKSAgLA0KICAgICAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemU9NSkpKw0KICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZT0iUGFpcmVkIikNCmdnc2F2ZSgiLi9yZXN1bHRzL2JlYS9tYWpvcml0eV9vd25lZF9ub25iYW5rL3B0X2V1X3NhX3JlbGF0aXZhLnBuZyIpDQoNCg0KYGBgDQoNCg0KYGBge3J9DQoNCiMjIE5pdmVsIGRlIHByb2R1Y3RpdmlkYWQgKHRvZG9zIGxvcyBzZWN0b3JlcykNCmRhdGEgJT4lDQogIGZpbHRlciggY291bnRyeSAlaW4lIGMoIlNvdXRoIEFtZXJpY2EiLCAiRXVyb3BlYW4gVW5pb24iLCAiQWxsIENvdW50cmllcyBUb3RhbCIpICkgJT4lDQogIGdyb3VwX2J5KGNvdW50cnksIHNlY3RvcikgJT4lIA0KICBzdW1tYXJpc2UoVEdzdG9jayA9IG1lYW4oVEdzdG9jaywgbmEucm09VCkgLCANCiAgICAgICAgICAgIFBUID0gbWVhbihQVC8xMGUzLCBuYS5ybT1UKSkgJT4lIA0KICBnZ3Bsb3QoYWVzKGNvdW50cnksIFBULCBmaWxsID0gY291bnRyeSkpICsNCiAgZ2VvbV9jb2wocG9zaXRpb24gPSAiZG9kZ2UiKSsNCiAgZmFjZXRfd3JhcCh+c2VjdG9yLCBzY2FsZXMgPSAiZnJlZSIpKw0KICB0aGVtZV9taW5pbWFsKCkrDQogIGxhYnModGl0bGU9ICJQcm9kdWN0aXZpZGFkIGRlIGludmVyc2lvbmVzIGRlIEVFVVUiLCANCiAgICAgICBzdWJ0aXRsZSA9ICJBbcOpcmljYSBkZWwgU3VyLCBFdXJvcGEgeSB0b3RhbCBwYcOtc2VzIChwcm9tZWRpbyAxOTk5LTIwMTkpIiwNCiAgICAgICB5ID0gIk1pbGVzIGRlIFVTRCBwb3Igb2JyZXJvIikrDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLA0KICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplPSA4KSwNCiAgICAgICAgYXhpcy50aXRsZS54ICA9IGVsZW1lbnRfYmxhbmsoKSAsDQogICAgICAgIGF4aXMudGl0bGUueSAgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDUpICwNCiAgICAgICAgc3RyaXAudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplPTUpKSsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPXdlc19wYWxldHRlKG49MywgbmFtZT0iTW9vbnJpc2UzIikpDQpnZ3NhdmUoIi4vcmVzdWx0cy9iZWEvbWFqb3JpdHlfb3duZWRfbm9uYmFuay9wdF9ldV9zYV9hbGxfYXZnLnBuZyIpDQoNCg0KIyMgTml2ZWwgZGUgcHJvZHVjdGl2aWRhZCAoc2VjdG9yZXMgc2VsZWNjaW9uYWRvcykNCmRhdGEgJT4lDQogIGZpbHRlciggY291bnRyeSAlaW4lIGMoIlNvdXRoIEFtZXJpY2EiLCAiRXVyb3BlYW4gVW5pb24iLCAiQWxsIENvdW50cmllcyBUb3RhbCIpICYNCiAgICAgICAgICAgIHNlY3RvciAlaW4lIGMoIkFsbCBJbmR1c3RyaWVzIFRvdGFsIiwiTWluaW5nIiwgIlRyYW5zcG9ydGF0aW9uIEVxdWlwbWVudCIsICJUb3RhbCBNYW51ZmFjdHVyaW5nIiAgICAgICAgKSkgJT4lDQogIGdyb3VwX2J5KGNvdW50cnksIHNlY3RvcikgJT4lIA0KICBzdW1tYXJpc2UoVEdzdG9jayA9IG1lYW4oVEdzdG9jaywgbmEucm09VCkgLCANCiAgICAgICAgICAgIFBUID0gbWVhbihQVC8xMGUzLCBuYS5ybT1UKSkgJT4lIA0KICBnZ3Bsb3QoYWVzKGNvdW50cnksIFBULCBmaWxsID0gY291bnRyeSkpICsNCiAgZ2VvbV9jb2wocG9zaXRpb24gPSAiZG9kZ2UiKSsNCiAgZmFjZXRfd3JhcCh+c2VjdG9yLCBzY2FsZXMgPSAiZnJlZSIpKw0KICB0aGVtZV9taW5pbWFsKCkrDQogIGxhYnModGl0bGU9ICJQcm9kdWN0aXZpZGFkIGRlbCB0cmFiYWpvIGRlIGludmVyc2lvbmVzIGRlIEVFVVUiLCANCiAgICAgICBzdWJ0aXRsZSA9ICJBbcOpcmljYSBkZWwgU3VyLCBFdXJvcGEgeSB0b3RhbCBwYcOtc2VzIChwcm9tZWRpbyAxOTk5LTIwMTkpIiwNCiAgICAgICB5ID0gIk1pbGVzIGRlIFVTRCBwb3Igb2JyZXJvIikrDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0gdGl0bGVfc2l6ZSksDQogICAgICAgIHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0gdGl0bGVfc2l6ZSouOCksDQogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLA0KICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemU9dGV4dF9zaXplKSwNCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemU9IHRleHRfc2l6ZSksDQogICAgICAgIGF4aXMudGl0bGUueCAgPSBlbGVtZW50X2JsYW5rKCkgLA0KICAgICAgICBheGlzLnRpdGxlLnkgID0gZWxlbWVudF90ZXh0KHNpemUgPSB0ZXh0X3NpemUpICwNCiAgICAgICAgc3RyaXAudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplPXRleHRfc2l6ZSkpKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9d2VzX3BhbGV0dGUobj0zLCBuYW1lPSJNb29ucmlzZTMiKSkNCmdnc2F2ZSgiLi9yZXN1bHRzL2JlYS9tYWpvcml0eV9vd25lZF9ub25iYW5rL3B0X2V1X3NhX2FsbF9hdmdfc2VjdG9ycy5wbmciLCB3aWR0aCA9IDE1LCBoZWlnaHQ9MTApDQoNCmBgYA0KDQojIyBURyB5IFBUDQpgYGB7cn0NCmRhdGEgJT4lDQogIGZpbHRlciggY291bnRyeSAlaW4lIGMoIlNvdXRoIEFtZXJpY2EiLCAiRXVyb3BlYW4gVW5pb24iLCAiQWxsIENvdW50cmllcyBUb3RhbCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgIkFzaWEgYW5kIFBhY2lmaWMiLCAiQ2VudHJhbCBBbWVyaWNhIiwgIk1leGljbyIpICkgJT4lIA0KICBmaWx0ZXIoIHNlY3RvciAlaW4lIGMoIkFsbCBJbmR1c3RyaWVzIFRvdGFsIiwiTWluaW5nIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAiVHJhbnNwb3J0YXRpb24gRXF1aXBtZW50IiwgIlRvdGFsIE1hbnVmYWN0dXJpbmciICApICkgJT4lIA0KICBncm91cF9ieShjb3VudHJ5LCBzZWN0b3IpICU+JSANCiAgc3VtbWFyaXNlKFRHc3RvY2sgPSBtZWFuKFRHc3RvY2ssIG5hLnJtPVQpICwgDQogICAgICAgICAgICBQVCA9IG1lYW4oUFQvMTBlMywgbmEucm09VCkpICU+JSANCiAgcmVzaGFwZTI6Om1lbHQoKSAlPiUgDQogIGdncGxvdChhZXMoeD1yZW9yZGVyKHZhcmlhYmxlLC12YWx1ZSkseT0gdmFsdWUsIGZpbGwgPSBjb3VudHJ5KSkgKw0KICAjIGdlb21fY29sKHBvc2l0aW9uID0gImRvZGdlIikrDQogIGdlb21fYmFyKHBvc2l0aW9uID0gImRvZGdlIiwgc3RhdD0iaWRlbnRpdHkiKSsNCiAgZmFjZXRfd3JhcChzZWN0b3J+dmFyaWFibGUsDQogICAgICAgICAgICAgc2NhbGVzPSAiZnJlZSIsDQogICAgICAgICAgICAgbmNvbD0yDQogICAgICAgICAgICAgIyAsc3RyaXAucG9zaXRpb24gPSBjKCJsZWZ0IiwgInRvcCIpDQogICAgICAgICAgICAgIyBsYWJlbGxlciA9IGFzX2xhYmVsbGVyKGMoVEdzdG9jayA9ICJyYXRpbyBURyIsIFBUID0gIk1pbGVzIGRlIFVTRCBwb3Igb2JyZXJvIikgKQ0KICAgICAgICAgICAgICkrDQogIHRoZW1lX21pbmltYWwoKSsNCiAgbGFicyh0aXRsZT0gIlByb2R1Y3RpdmlkYWQgZGVsIHRyYWJham8geSBURyBkZSBpbnZlcnNpb25lcyBkZSBFRVVVIiwgDQogICAgICAgc3VidGl0bGUgPSAiUHJvbWVkaW8gMTk5OS0yMDE5IiwgeT0iTWlsZXMgZGUgVVNEIHBvciBvYnJlcm8geSByYXRpbyBURyIpKw0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9IDEyKSwNCiAgICAgICAgcGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPSAxMiouOCksDQogICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemU9NyksDQogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLA0KICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemU9IDEwKSwNCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZT0gNyksDQogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemU9MTApLA0KICAgICAgICBzdHJpcC5wbGFjZW1lbnQgPSAib3V0c2lkZSIgKSsNCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZT0iUGFpcmVkIikNCmdnc2F2ZSgiLi9yZXN1bHRzL2JlYS9tYWpvcml0eV9vd25lZF9ub25iYW5rL3RnX3lfcHRfZXVfc2FfYWxsX2F2Z19zZWN0b3JzX21vcmVfY291bnRyaWVzLnBuZyIsIHdpZHRoID0gMjAsIGhlaWdodCA9IDE1KQ0KDQpkYXRhICU+JQ0KICBmaWx0ZXIoIGNvdW50cnkgJWluJSBjKCJTb3V0aCBBbWVyaWNhIiwgIkV1cm9wZWFuIFVuaW9uIiwgIkFsbCBDb3VudHJpZXMgVG90YWwiKSApICU+JQ0KICAjIGZpbHRlciggc2VjdG9yICVpbiUgYygiQWxsIEluZHVzdHJpZXMgVG90YWwiLCJNaW5pbmciLCANCiAgIyAgICAgICAgICAgICAgICAgICAgICAgIlRyYW5zcG9ydGF0aW9uIEVxdWlwbWVudCIsICJUb3RhbCBNYW51ZmFjdHVyaW5nIiAgKSApICU+JSANCiAgZ2dwbG90KGFlcyhQVC8xMGUzLCBUR3N0b2NrLCBjb2xvciA9IGNvdW50cnkpKSArDQogIGdlb21fcG9pbnQoKSsNCiAgZmFjZXRfd3JhcCh+c2VjdG9yLCBzY2FsZXMgPSAiZnJlZV95IikrDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnRfZm9ybWF0KGFjY3VyYWN5ID0gMC4xTCkpKw0KICB0aGVtZV9taW5pbWFsKCkrDQogIGxhYnModGl0bGU9ICJQcm9kdWN0aXZpZGFkIGRlbCB0cmFiYWpvIHkgVEcgZGUgaW52ZXJzaW9uZXMgZGUgRUVVVSIsIA0KICAgICAgIHN1YnRpdGxlID0gIkFtw6lyaWNhIGRlbCBTdXIsIEV1cm9wYSB5IHRvdGFsIHBhw61zZXMiLA0KICAgICAgIHg9IlByb2R1Y3RpdmlkYWQgZGVsIHRyYWJham8iLCB5PSAiVGFzYSBkZSBnYW5hbmNpYSIpKw0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9IHRpdGxlX3NpemUqLjUpLA0KICAgICAgICBwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9IHRpdGxlX3NpemUqLjUqLjgpLA0KICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwNCiAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplPSAxNCksDQogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemU9IDE0KSwNCiAgICAgICAgc3RyaXAudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplPTE0KSkrDQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9d2VzX3BhbGV0dGUobj0zLCBuYW1lPSJHcmFuZEJ1ZGFwZXN0MSIpKQ0KZ2dzYXZlKCIuL3Jlc3VsdHMvYmVhL21ham9yaXR5X293bmVkX25vbmJhbmsvdGdfeV9wdF9ldV9zYV9hbGxfc2NhdHRlci5wbmciLCB3aWR0aCA9IDE1LCBoZWlnaHQgPSAxMCkNCg0KZGF0YSAlPiUNCiAgZmlsdGVyKCBjb3VudHJ5ICVpbiUgYygiU291dGggQW1lcmljYSIsICJFdXJvcGVhbiBVbmlvbiIsICJBbGwgQ291bnRyaWVzIFRvdGFsIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAiQXNpYSBhbmQgUGFjaWZpYyIsICJDZW50cmFsIEFtZXJpY2EiLCAiTWV4aWNvIg0KICAgICAgICAgICAgICAgICAgICAgICAgICkgKSAlPiUNCiAgZmlsdGVyKCBzZWN0b3IgJWluJSBjKCJBbGwgSW5kdXN0cmllcyBUb3RhbCIsIyJNaW5pbmciLA0KICAgICAgICAgICAgICAgICAgICAgICAgIlRyYW5zcG9ydGF0aW9uIEVxdWlwbWVudCIsICJUb3RhbCBNYW51ZmFjdHVyaW5nIiAgKSApICU+JQ0KICBncm91cF9ieShjb3VudHJ5LCBzZWN0b3IpICU+JSANCiAgc3VtbWFyaXNlKFRHc3RvY2sgPSBtZWFuKFRHc3RvY2ssIG5hLnJtPVQpICwgDQogICAgICAgICAgICBQVCA9IG1lYW4oUFQvMTBlMywgbmEucm09VCkpICU+JSANCiAgZ2dwbG90KGFlcyhQVCwgVEdzdG9jaywgY29sb3IgPSBjb3VudHJ5KSkgKw0KICBnZW9tX3BvaW50KHNpemU9NykrDQogIGZhY2V0X3dyYXAofnNlY3Rvcg0KICAgICAgICAgICAgICMgLCBzY2FsZXMgPSAiZnJlZV95Ig0KICAgICAgICAgICAgICkrDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnRfZm9ybWF0KGFjY3VyYWN5ID0gMC4xTCkpKw0KICB0aGVtZV9saW5lZHJhdygpKw0KICBsYWJzKHRpdGxlPSAiUHJvZHVjdGl2aWRhZCB5IFRHIGRlIGludmVyc2lvbmVzIGRlIEVFVVUiLCANCiAgICAgICBzdWJ0aXRsZSA9ICJBbcOpcmljYSBkZWwgU3VyLCBFdXJvcGEgeSB0b3RhbCBwYcOtc2VzIChwcm9tZWRpbyAxOTk5LTIwMTkpIiwNCiAgICAgICB4PSJQcm9kdWN0aXZpZGFkIGRlbCB0cmFiYWpvIChtaWxlcyBkZSBVU0QgcG9yIG9icmVybykiLCB5PSAiVGFzYSBkZSBnYW5hbmNpYSIpKw0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9IHRpdGxlX3NpemUpLA0KICAgICAgICBwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9IHRpdGxlX3NpemUqLjgpLA0KICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwNCiAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplPXRleHRfc2l6ZSksDQogICAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT10ZXh0X3NpemUpLA0KICAgICAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZT10ZXh0X3NpemUpLA0KICAgICAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemU9dGV4dF9zaXplLTUpKSsNCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGU9IlBhaXJlZCIpDQpnZ3NhdmUoIi4vcmVzdWx0cy9iZWEvbWFqb3JpdHlfb3duZWRfbm9uYmFuay90Z195X3B0X2V1X3NhX2FsbF9hdmdfc2NhdHRlcl9zZWxlY3RlZF9jb3VudHJpZXMucG5nIiwgd2lkdGggPSAxNSwgaGVpZ2h0ID0gMTApDQoNCmBgYA0KDQoNCiMgU2FsYXJpbw0KYGBge3J9DQoNCg0KZGF0YSAlPiUNCiAgZmlsdGVyKCBjb3VudHJ5ICVpbiUgYygiU291dGggQW1lcmljYSIsICJFdXJvcGVhbiBVbmlvbiIsICJBbGwgQ291bnRyaWVzIFRvdGFsIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAiQXNpYSBhbmQgUGFjaWZpYyIsICJDZW50cmFsIEFtZXJpY2EiLCAiTWV4aWNvIikgKSAlPiUgDQogIGZpbHRlciggc2VjdG9yICVpbiUgYygiQWxsIEluZHVzdHJpZXMgVG90YWwiLCJNaW5pbmciLCANCiAgICAgICAgICAgICAgICAgICAgICAgICJUcmFuc3BvcnRhdGlvbiBFcXVpcG1lbnQiLCAiVG90YWwgTWFudWZhY3R1cmluZyIgICkgKSAlPiUgDQogIGdyb3VwX2J5KGNvdW50cnksIHNlY3RvcikgJT4lIA0KICBzdW1tYXJpc2UoUmVtID0gbWVhbihSZW0qMTBlNiwgbmEucm09VCkgKSAlPiUgDQogIHJlc2hhcGUyOjptZWx0KCkgJT4lIA0KICBnZ3Bsb3QoYWVzKHg9cmVvcmRlcih2YXJpYWJsZSwtdmFsdWUpLHk9IHZhbHVlLCBmaWxsID0gY291bnRyeSkpICsNCiAgIyBnZW9tX2NvbChwb3NpdGlvbiA9ICJkb2RnZSIpKw0KICBnZW9tX2Jhcihwb3NpdGlvbiA9ICJkb2RnZSIsIHN0YXQ9ImlkZW50aXR5IikrDQogIGZhY2V0X3dyYXAofnNlY3Rvciwgc2NhbGVzID0gImZyZWUiLCBuY29sPTIpKw0KICB0aGVtZV9taW5pbWFsKCkrDQogIGxhYnModGl0bGU9ICJTYWxhcmlvIHByb21lZGlvIGVuIGxhcyBpbnZlcnNpb25lcyBkZSBFRVVVIiwgDQogICAgICAgc3VidGl0bGUgPSAiUHJvbWVkaW8gMTk5OS0yMDE5IiwgeT0iVVNEIikrDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT10aXRsZV9zaXplKSwNCiAgICAgICAgcGxvdC5zdWJ0aXRsZSAgPSBlbGVtZW50X3RleHQoc2l6ZT10aXRsZV9zaXplKi44KSwNCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsDQogICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZT10ZXh0X3NpemUpLA0KICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplPSB0ZXh0X3NpemUpLA0KICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplPSB0ZXh0X3NpemUpLA0KICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgc3RyaXAudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplPXRleHRfc2l6ZSkpKw0KICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlPSJQYWlyZWQiKQ0KZ2dzYXZlKCIuL3Jlc3VsdHMvYmVhL21ham9yaXR5X293bmVkX25vbmJhbmsvc2FsYXJpb19hdmdfc2VjdG9ycy5wbmciLCB3aWR0aCA9IDE1LCBoZWlnaHQgPSAxMCkNCg0KYGBgDQoNCg==